package com.tmc.service.baseinfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.tmc.bean.common.CommonResult;
import com.tmc.bean.common.ContextInfo;
import com.tmc.bean.common.Pagination;
import com.tmc.constant.CacheConstant;
import com.tmc.dao.impl.AirlineDaoImpl;
import com.tmc.entity.baseinfo.Airline;
import com.tmc.service.cache.CacheServiceImpl;
import com.tmc.util.ObjectUtil;

@Service
@Transactional
public class AirlineServiceImpl {

	@Autowired
	private AirlineDaoImpl dao;
	
	@Autowired
	private CacheServiceImpl cache;
	
	private static String all_key = "KEY_AIRLINE_ALL";
	
	private static String map_key = "KEY_AIRLINE_ALL_MAP";

	private Log logger = LogFactory.getLog(this.getClass());

	public Pagination<Airline> findByCon(ContextInfo context, Airline cond, int pageIndex, int pageSize) {
		Pagination<Airline> result = dao.findByCon(context, cond, pageIndex, pageSize);
		return result;
	}
	
	public Airline getByCode(String code){
		if (ObjectUtil.noText(code)){
			return null;
		}
		Map<String, Airline> airlines = this.findMapFromCache(null);
		return airlines.get(code.toUpperCase());
	}
	
	public String getNameByCode(String code){
		Airline airline = this.getByCode(code);
		if (airline == null){
			return "";
		}
		return airline.getAirlineName();
	}

	public List<Airline> findAllFromCache() {
		if (cache.get(CacheConstant.CACHE_NAME_600, all_key) != null) {
			return (List<Airline>) cache.get(CacheConstant.CACHE_NAME_600, all_key);
		}
		List<Airline> list = dao.findAll();
		cache.put(CacheConstant.CACHE_NAME_600, all_key, list);
		return list;
	}

	public Map<String, Airline> findMapFromCache(ContextInfo context) {
		if (cache.get(CacheConstant.CACHE_NAME_600, map_key) != null) {
			return (Map<String, Airline>) cache.get(CacheConstant.CACHE_NAME_600, map_key);
		}
		Map<String, Airline> map = this.toMap(this.findAllFromCache());
		cache.put(CacheConstant.CACHE_NAME_600, map_key, map);
		return map;
	}

	private Map<String, Airline> toMap(List<Airline> airlines) {
		Map<String, Airline> map = new HashMap<String, Airline>();
		for (Airline airline : airlines) {
			map.put(airline.getAirlineCode(), airline);
		}
		return map;
	}

	@CacheEvict(value = CacheConstant.CACHE_NAME_600, key = "'KEY_AIRLINE_ALL'")
	public CommonResult delete(ContextInfo context, Long airlineId) {
		Airline airline = dao.getById(airlineId);
		if (airline != null) {
			ObjectUtil.updateBaseInfo(airline, context);
			airline.setEnabledFlag("N");
			dao.update(airline);
		}
		return CommonResult.makeSuccess("删除成功！");
	}

	public Airline getById(ContextInfo context, Long airlineId) {
		return dao.getById(airlineId);
	}

	@Deprecated
	public List<Airline> findAll(ContextInfo context) {
		return dao.findAll();
	}

	@CacheEvict(value = CacheConstant.CACHE_NAME_600, key = "'KEY_AIRLINE_ALL'")
	public CommonResult save(ContextInfo context, Airline airline) {
		airline.setAirlineCode(airline.getAirlineCode().toUpperCase());
		CommonResult check = this.check(airline);
		if (!check.isSuccess()) {
			return check;
		}
		// 保存
		if (airline.getAirlineId() == null) {
			Airline dbAirline = dao.getByCode(context, airline.getAirlineCode());
			if (dbAirline != null) {
				return CommonResult.makeFail("已存在航司：" + airline.getAirlineCode());
			}
			ObjectUtil.setBaseInfo(airline, context);
			dao.insert(airline);
		} else {
			// 编辑
			try {
				Airline dbAirline = dao.getById(airline.getAirlineId());
				if (dbAirline != null) {
					ObjectUtil.copyProperties(airline, dbAirline,
							new String[] { "createdBy", "creationDate", "airlineId", "enabledFlag" });
				}
				ObjectUtil.updateBaseInfo(dbAirline, context);
				dao.update(dbAirline);
			} catch (Exception e) {
				logger.error("拷贝对象错误！", e);
				return CommonResult.makeFail("拷贝对象错误！");
			}
		}
		return CommonResult.makeSuccess();
	}

	private CommonResult check(Airline airline) {
		if (!ObjectUtil.hasText(airline.getAirlineCode())) {
			return CommonResult.makeFail("二字码不能为空！");
		}
		if (!ObjectUtil.hasText(airline.getAirlineName())) {
			return CommonResult.makeFail("名字不能为空！");
		}
		return CommonResult.makeSuccess();
	}

	public static String AIR_LINE_DICTIONARY = "2K^盖尔航空(2K)@2M^摩尔达维亚航空(2M)@3K^捷星亚洲航空(3K)@3L^因特天空航空(3L)@3U^四川航空(3U)@4O^海洋航空(4O)@4U^德国之翼航空(4U)@5J^宿务太平洋(5J)@6A^阿维亚克萨航空(6A)@6E^马尔莫航空(6E)@6U^乌克兰航空(6U)@7B^克拉斯诺亚尔斯克航空(7B)@8M^缅甸国际航空(8M)@8U^利比亚泛非航空(8U)@9C^春秋航空(9C)@9K^海恩尼斯航空(9K)@9U^摩尔多瓦航空(9U)@9W^捷特航空(印度)有限(9W)@A3^爱琴海航空(A3)@A5^巴布亚新几内亚航空(A5)@A9^格鲁吉亚航空(A9)@AA^美国航空(AA)@AB^柏林航空公司(AB)@AC^加拿大航空(AC)@AD^巴西蔚蓝航空(AD)@AE^华信航空(AE)@AF^法国航空(AF)@AH^阿尔及利亚航空航空(AH)@AI^印度航空(AI)@AK^亚洲航空(AK)@AM^墨西哥航空(AM)@AP^一号航空公司(AP)@AR^阿根廷航空(AR)@AS^阿拉斯加航空(AS)@AT^摩洛哥皇家航空(AT)@AV^哥伦比亚国家航空(AV)@AY^芬兰航空(AY)@AZ^意大利航空(AZ)@B2^白俄罗斯航空(B2)@B5^东非旅行航空(B5)@B6^捷蓝航空(B6)@B7^立荣航空(B7)@BA^英国航空(BA)@BD^巴戎航空(BD)@BE^弗莱比航空(BE)@BG^孟加拉航空(BG)@BH^鹰空航空(BH)@BI^汶莱航空(BI)@BL^捷星太平洋(BL)@BP^博茨瓦纳航空(BP)@BR^长荣航空(BR)@BT^波罗的海航空(BT)@BV^蓝色全景航空(BV)@BW^英国西印度国际航空(BW)@BX^釜山航空(BX)@CA^中国国际航空(CA)@CE^南非国家航空(CE)@CI^中华航空(CI)@CM^巴拿马航空(CM)@CO^大陆航空(CO)@CQ^阳光快运航空(CQ)@CU^古巴航空(CU)@CX^国泰航空(CX)@CY^塞浦路斯航空(CY)@CZ^中国南方航空(CZ)@D2^谢韦尔空运(D2)@D6^因特航空(D6)@D7^亚航X(D7)@D9^顿河航空(D9)@DC^金色航空(DC)@DE^康多尔航空(DE)@DG^东南亚航空(DG)@DL^达美航空(DL)@DM^马尔斯克航空(DM)@DN^德干航空(DN)@DT^安哥拉航空(DT)@DV^斯卡特航空(DV)@E3^多蒙德多沃航空(E3)@EI^爱尔兰航空(EI)@EK^阿联酋航空(EK)@EN^多洛米蒂航空(EN)@EO^荷瓦波拉航空(EO)@EQ^厄瓜多尔军运航空(EQ)@ET^埃塞阿比亚航空(ET)@EY^阿联酋阿提哈德航空(EY)@F9^边疆航空(F9)@FB^保加利亚航空(FB)@FD^泰国亚洲航空(FD)@FE^远东航空 (FE)@FI^冰岛航空(FI)@FJ^斐济太平洋航空(FJ)@FK^阿联酋航空(FK)@FM^上海航空(FM)@FV^俄罗斯国家航空(FV)@FZ^迪拜航空(FZ)@G3^格鲁吉亚航空(G3)@GA^嘉鲁达印度尼西亚航空(GA)@GE^台湾复兴航空(GE)@GF^海湾航空(GF)@GL^格陵兰航空(GL)@GS^天津航空(GS)@GW^巴西蔚蓝航空(GW)@GY^爱琴海航空(GY)@H2^天空航空(H2)@HA^夏威夷航空(HA)@HF^哈帕克劳埃德航空(HF)@HG^尼基航空公司(HG)@HK^四星航空(HK)@HM^塞舌尔航空(HM)@HO^吉祥航空公司(HO)@HR^汉亚航空(HR)@HU^海南航空(HU)@HX^香港航空(HX)@HY^乌兹别克斯坦航空(HY)@HZ^萨哈林航线航空(HZ)@I5^马里航空公司(I5)@I9^意大利国家航空(I9)@IA^伊拉克航空(IA)@IB^西班牙航空(IB)@IE^所罗门航空(IE)@IG^子午线航空(IG)@IR^伊朗航空(IR)@IT^印度翠鸟航司(IT)@IY^也门航空(IY)@IZ^阿基亚以色列航空(IZ)@J2^阿塞拜疆航空(J2)@J8^马来西亚成功航空(J8)@JA^波黑航空公司(JA)@JD^北京首都航空公司(JD)@JJ^天马航空(JJ)@JL^日本航空(JL)@JO^日线航空公司(JO)@JP^亚得利亚航空(JP)@JQ^捷星航空(JQ)@JS^高丽航空(JS)@JU^南斯拉夫航空(JU)@JW^箭航(JW)@JZ^天空之路航空(JZ)@K6^柬埔寨吴哥航空(K6)@KA^港龙航空(KA)@KC^阿斯塔纳航空(KC)@KE^大韩航空(KE)@KF^蓝色第一航空 (KF)@KK^阿特拉斯喷气航空(KK)@KL^荷兰航空(KL)@KM^马耳他航空(KM)@KP^基维国际航空(KP)@KQ^肯尼亚航空(KQ)@KR^卡尔航空(KR)@KU^科威特航空(KU)@KX^开曼航空公司(KX)@LA^智利航空(LA)@LG^卢森堡航空公司(LG)@LH^汉莎航空(LH)@LI^背风群岛航空公司(LI)@LJ^塞拉国家航空(LJ)@LO^波兰航空(LO)@LR^哥斯达黎加航空(LR)@LX^瑞士航空(LX)@LY^以色列航空(LY)@MA^匈牙利航空(MA)@MD^马达加斯加航空(MD)@MF^厦门航空(MF)@MH^马来西亚航空(MH)@MI^胜安航空(MI)@MJ^阿根廷航空运输(MJ)@MK^毛里裘斯航空(MK)@MM^日本乐桃航空(MM)@MR^蒙古集团航空(MR)@MS^埃及航空(MS)@MU^中国东方航空(MU)@MX^墨西哥航空(MX)@NH^全日空航空(NH)@NK^精神航空(NK)@NN^维姆航空(NN)@NT^加那利航空(NT)@NW^美国西北航空(NW)@NX^澳门航空(NX)@NY^冰岛航空(NY)@NZ^新西兰航空(NZ)@O8^泰国暹罗航空(O8)@OA^希腊奥林匹克航空(OA)@OK^捷克航空(OK)@OM^蒙古航空(OM)@OQ^重庆航空(OQ)@OS^奥地利航空(OS)@OU^克罗地亚航空(OU)@OV^爱沙尼亚航空(OV)@OX^泰国东方航空(OX)@OZ^韩亚航空(OZ)@PC^斐济航空(PC)@PE^欧洲航空(PE)@PG^曼谷航空(PG)@PK^巴基斯坦航空(PK)@PQ^菲律宾亚航(PQ)@PR^菲律宾航空(PR)@PS^乌克兰国际航空(PS)@PU^乌拉圭国家航空(PU)@pw^坦桑尼亚精密航空(pw)@PX^巴布亚新几内亚航空(PX)@QF^澳洲航空(QF)@QR^卡塔尔航空(QR)@QS^塔特拉航空公司(QS)@QV^老挝航空(QV)@QZ^印尼亚洲航空(QZ)@R2^奥伦堡航空(R2)@RG^巴西航空(RG)@RJ^皇家约旦航空(RJ)@S2^印度撒哈拉航空(S2)@S3^圣巴巴拉航空(S3)@S4^萨塔航空(S4)@S7^新西伯利亚航空(S7)@SA^南非航空(SA)@SC^山东航空(SC)@SE^达伊罗货运航空(SE)@SF^包机航空(SF)@SI^瑞安航空(SI)@SK^北欧航空(SK)@SL^泰国狮航(SL)@SN^布鲁塞尔航空(SN)@SQ^新加坡航空(SQ)@SS^科西嘉国际航空(SS)@SU^俄罗斯航空(SU)@SV^沙特阿拉伯航司(SV)@SW^纳米比亚航空(SW)@T4^泰坦航空(T4)@T5^土库曼斯坦航空(T5)@TA^塔卡国际航空(TA)@TG^泰国航空(TG)@TK^土耳其航空(TK)@TM^拉姆航空(TM)@TN^大溪地航空(TN)@TP^葡萄牙航空(TP)@TR^新加坡虎航(TR)@TU^突尼斯航空(TU)@TZ^新加坡酷航(TZ)@U2^易捷航空(U2)@U6^乌拉尔航空(U6)@U7^乌干达航空(U7)@U9^鞑靼斯坦航空(U9)@UA^美国联合航空(UA)@UL^斯里兰卡航空(UL)@UM^津巴布韦航空(UM)@UN^俄罗斯联邦州际航空(UN)@UO^香港快运航空(UO)@US^全美航空(US)@UT^俄罗斯优梯航空(UT)@UX^西班牙欧洲航空(UX)@V1^乌兰航空(V1)@V3^卡帕特航空(V3)@V7^西班牙Volotea(V7)@VA^委内瑞拉国际航空(VA)@VF^捷星惠旅航空(VF)@VK^维珍尼日利亚航空(VK)@VN^越南航空(VN)@VR^佛得角航空(VR)@VS^维珍大西洋航空(VS)@VV^乌克兰航空(VV)@VX^维珍美国航空(VX)@W3^尼日利亚航空(W3)@WB^卢旺达航空(WB)@WM^向风群岛航空(WM)@WP^海岛航空(WP)@WS^西捷航空(WS)@WY^阿曼航空(WY)@X3^哈帕克劳埃德航空(X3)@XF^符拉迪沃斯托克航空(XF)@XK^地中海科西嘉航空(XK)@XL^法国特大航空(XL)@XQ^行动航空(XQ)@Y7^银捷航空(Y7)@YM^黑山航空(YM)@YO^摩纳哥直升机航空(YO)@YQ^波莱特航空(YQ)@YV^梅萨航空(YV)@Z2^AirAsia ZEST Airways(Z2)@Z6^第聂伯罗航空(Z6)@ZC^斯威士兰皇家航空(ZC)@ZH^深圳航空(ZH)@ZK^大湖航空(ZK)";
	public void updateFromFile(ContextInfo context) {
		List<Airline> airlines = new ArrayList<Airline>();
		try {
			// 这是读取文件修改机场名
			//String[] datas = TxtUtil.get("C:/Users/legion/Desktop/airline/whitescreen.jinri.net/citydat.js");
			Airline tmp = null;
			for (String data : AIR_LINE_DICTIONARY.split("@")) {
				String one = data.split("\\(")[0];
				String[] codes = one.split("\\^");
				if (ObjectUtil.noText(codes[0]) || ObjectUtil.noText(codes[1])){
					continue;
				}
				System.out.println(codes[0] + codes[1]);
				tmp = new Airline();
				tmp.setAirlineCode(codes[0]);
				tmp.setAirlineName(codes[1]);
				airlines.add(tmp);
			}
			//Map<String, Airline> map = new HashMap<String, Airline>();
			for (Airline airline : airlines) {
				Airline dbAirline = dao.getByCode(context, airline.getAirlineCode());
				if (dbAirline != null){
					dbAirline.setAirlineName(airline.getAirlineName());
					this.save(context, dbAirline);
				} else {
					this.save(context, airline);
				}
				/*String code = airline.getAirlineCode();
				String name = airline.getAirlineName();
				if (map.containsKey(name)){
					System.out.println(code + "/" + name);
				} else {
					map.put(name, airline);
				}*/
			}
		} catch (Exception e) {
			logger.error(e);
		} finally {
			System.out.println("处理完毕，个数" + airlines.size());
		}

	}

	public List<Airline> searchAirline(String query) {
		query = query.toUpperCase();
		Map<String, Airline> map = this.findMapFromCache(null);
		List<Airline> Airlines = new ArrayList<Airline>();
		if(ObjectUtil.noText(query)){
			Airlines.add(map.get("CA"));
			Airlines.add(map.get("UA"));
			Airlines.add(map.get("BA"));
			Airlines.add(map.get("CZ"));
			Airlines.add(map.get("MU"));
			Airlines.add(map.get("MF"));
			Airlines.add(map.get("CX"));
			Airlines.add(map.get("FM"));
			Airlines.add(map.get("HU"));
			Airlines.add(map.get("DZ"));
			return Airlines;
		}
		for (Airline airline : map.values()) {
			if (airline.getAirlineCode().indexOf(query) > -1 || airline.getAirlineName().indexOf(query) > -1 ||
					(airline.getAirlineName()+"("+airline.getAirlineCode()+")").indexOf(query) > -1) {
				Airlines.add(airline);
				if (Airlines.size() == 8) {
					return Airlines;
				}
			}
		}
		return Airlines;
	}
}
